package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.CuentaSesion;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DAOCuentas {

    private final String TABLA_CUENTAS = "cuentas";
    private final String COLUMNA_NOMBRE_USUARIO = "usrname";
    private final String COLUMNA_PASSWORD = "password";
    private final String COLUMNA_TIPO_PRIVILEGIO = "tipoUsuario";
    private final String COLUMNA_ID_INFORMACION = "id_informacion";
    private final String REFERENCIA_TABLA_INFORMACION_PERSONAL = "informacionpersonal";
    private final String REFERENCIA_COLUMNA_ID_INFORMACION = "id_informacion";
    private final String REFERENCIA_COLUMNA_NOMBRES = "nombres";
    private final String REFERENCIA_COLUMNA_APELLIDO_PATERNO = "apaterno";
    private final String REFERENCIA_COLUMNA_APELLIDO_MATERNO = "amaterno";
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    private Connection conexion = null;

    public DAOCuentas() {
        this.conexion = acceso.abrirConexion();
    }

    public ResultSet buscarCuenta(String nombreUsuario) {
        ResultSet resultado = null;

        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT * FROM " + TABLA_CUENTAS + " WHERE " + COLUMNA_NOMBRE_USUARIO + " = '" + nombreUsuario + "' ";
            resultado = sentencia.executeQuery(querySearch);

        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de buscar la cuenta");
        }

        return resultado;
    }

    public void cerrarConexionACuentas() {
        acceso.cerrarConexion(conexion);
    }

    public void eliminarCuenta(String cuentaEliminar) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String deleteQuery = "DELETE FROM " + TABLA_CUENTAS + " WHERE " + COLUMNA_NOMBRE_USUARIO + " = '" + cuentaEliminar + "'";
            sentencia.executeUpdate(deleteQuery);
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de eliminar la cuenta");
        }
    }
   
       public ResultSet buscarInformacionPersonalDeCuenta(String nombreDeUsuario, int tipoDeUsuario) {
        ResultSet resultado = null;

        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT " + REFERENCIA_TABLA_INFORMACION_PERSONAL + "." + REFERENCIA_COLUMNA_NOMBRES + ", "
                    + REFERENCIA_TABLA_INFORMACION_PERSONAL + "." + REFERENCIA_COLUMNA_APELLIDO_PATERNO + ", " + REFERENCIA_TABLA_INFORMACION_PERSONAL + "." + REFERENCIA_COLUMNA_APELLIDO_MATERNO
                    + " FROM " + TABLA_CUENTAS + ", " + REFERENCIA_TABLA_INFORMACION_PERSONAL + " WHERE " + TABLA_CUENTAS + "." + COLUMNA_NOMBRE_USUARIO + " = '" + nombreDeUsuario + "' AND "
                    + TABLA_CUENTAS + "." + COLUMNA_ID_INFORMACION + " = " + REFERENCIA_TABLA_INFORMACION_PERSONAL + "." + REFERENCIA_COLUMNA_ID_INFORMACION
                    + " AND " + TABLA_CUENTAS + "." + COLUMNA_TIPO_PRIVILEGIO + " = '" + tipoDeUsuario + "';";
            resultado = sentencia.executeQuery(querySearch);
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de buscar la información personal de la cuenta");
        }

        return resultado;
    }  

    public void actualizarContraseniaDeCuenta(String nombreDeUsuario, String contraseniaNueva) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryUpdate = "UPDATE " + TABLA_CUENTAS + " SET " + COLUMNA_PASSWORD + " = '" + contraseniaNueva + "' "
                    + "WHERE " + COLUMNA_NOMBRE_USUARIO + " = '" + nombreDeUsuario + "';";
           
            sentencia.executeUpdate(queryUpdate);
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de actualizar la contraseña de la cuenta");
        }
    }

    public void registrarCuenta(CuentaSesion cuentaSesion, int tipoPrivilegio, int idInformacion) {
        try {
            String nombreDeUsuario = cuentaSesion.getNombreUsuario();
            String contrasenia = cuentaSesion.getContrasenia();

            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryInsertar = "INSERT INTO " + TABLA_CUENTAS + " (" + COLUMNA_NOMBRE_USUARIO + ", " + COLUMNA_PASSWORD + ", "
                    + COLUMNA_TIPO_PRIVILEGIO + ", " + COLUMNA_ID_INFORMACION +") VALUES ('" + nombreDeUsuario + "', '" + contrasenia + "', '" + tipoPrivilegio + "', '"+idInformacion+"');";
            sentencia.executeUpdate(queryInsertar);
        } catch (SQLException ex) {
            System.out.println("Ocurió un problema al tratar de registrar la cuenta");
        }
    }

    public boolean existeCuenta(String nombreDeUsuario) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String querySearch = "SELECT * FROM " + TABLA_CUENTAS + " WHERE " + COLUMNA_NOMBRE_USUARIO + " = '" + nombreDeUsuario + "';";
            ResultSet resultado = sentencia.executeQuery(querySearch);
           

            int contadorDeRegistros = 0;
            while (resultado.next()) {
                contadorDeRegistros++;
            }

            if (contadorDeRegistros != 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOCuentas.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    public void actualizarCuentaAdministrador(String nombreActual, String nombreModif, String passModif) {
      try {
          System.out.println(passModif);
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryUpdate = "UPDATE " + TABLA_CUENTAS + " SET " + COLUMNA_PASSWORD + " = '" + passModif + "' ,"+ COLUMNA_NOMBRE_USUARIO + 
                    " = '" + nombreModif + "' "                     
                    + "WHERE " + COLUMNA_NOMBRE_USUARIO + " = '" + nombreActual+ "';";
           
            sentencia.executeUpdate(queryUpdate);
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de actualizar la contraseña de la cuenta");
        }
    }
}